/**
 * @file Socket.hpp
 * @brief Socket封装类的声明
 * @details 封装了socket文件描述符，提供RAII风格的资源管理
 */

#ifndef __Socket_HPP__
#define __Socket_HPP__
#include "Noncopyable.hpp"

namespace wd
{

/**
 * @class Socket
 * @brief Socket封装类
 * @details 封装socket文件描述符，不可复制，自动管理资源生命周期
 */
class Socket 
: Noncopyable
{
public:
    /**
     * @brief 默认构造函数，创建新socket
     */
    Socket();
    
    /**
     * @brief 从已存在的文件描述符构造
     * @param fd socket文件描述符
     */
    explicit Socket(int fd)
    : _fd(fd)
    {}

    /**
     * @brief 析构函数，自动关闭socket
     */
    ~Socket();

    /**
     * @brief 获取socket文件描述符
     * @return 文件描述符
     */
    int fd() const {return _fd; }
    
    /**
     * @brief 关闭socket的写端
     */
    void shutdownWrite();

private:
    int _fd;  ///< socket文件描述符
};

}//end of namespace wd


#endif

